<?php

namespace app\adminapi\controller;

use think\Controller;
use think\Request;

class Category extends BaseApi
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index(Request $request)
    {
        # 接收参数
        $data = input();
        # 判断他是否传入pid，如果没有传入pid那就直接将无限级分类返回给前端
        if(empty($data["pid"])){
            # 获取到所有的数据
            $list = \app\common\model\Category::field("id,cate_name,pid,pid_path_name,level,is_show,is_hot,image_url")->select();
            # 将获取到的数据先转为对像再转为成一个标准的二维数组
            //$list = (new \think\Collection($list))->toArray();
            # 再调用封装好的无限级分类的 递归数组里循环成功无限级分类
            //$list = get_cate_list($list);
        }else{
            # 如果传入了pid那就根据pid去获取到所有的数据
            $list = \app\common\model\Category::field("id,cate_name,pid")->where("pid",$data["pid"])->select();
        }
        # 判断他是否传入type 而且他不为空 或者 他不等于list 的时候直接返回列表 如果等于那就无限级分类列表
        if(empty($data["type"]) || $data["type"] != "list"){
            # 将获取到的数据先转为对像再转为成一个标准的二维数组
            $list = (new \think\Collection($list))->toArray();
            # 再调用封装好的无限级分类的 递归数组里循环成功无限级分类
            $list = get_cate_list($list);            
        }
        # 返回数据
        $this->ok($list);
    }
    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        # 接收数据
        $data = input();
        # 参数检测
        $validata = $this->validate($data,[
            "cate_name|分类名称" => "require",
            "pid|上级id" => "require|>=:0|integer",
            "is_show|是否显示" => "require|in:0,1",
            "is_hot|是否热门" => "require|in:0,1",
            "sort|排序" => "require|integer",
        ]);
        if($validata !== true){
            $this->fail($validata);
        }
        # 数据处理
        # 判断他传入的pid是否为0，也就中顶级的pid，如果是那就不用进行其他处理
        if($data["pid"] == 0){
            $data["pid_path"] = 0;
            $data["pid_path_name"] = "";
            $data["level"] = 0;
        }else{
            # 如果不等于0那就要进行一个数据的处理
            # 根据他传入进来的pid去查询到一条数据
            $p_find = \app\common\model\Category::where("id",$data["pid"])->find();
            # 根据获取的数据里面的拿取出 查询到的数据里 pid_paht 和里面的 id进行一个拼接就可以形成对于的pid，就可以添加成层级
            $data["pid_path"] = $p_find["pid_path"] . "_" . $p_find["id"];
            # 查询到的数据里面的pid_path_name 和表里面的 cate_name 进行拼接
            $data["pid_path_name"] = trim($p_find["pid_path_name"] . "_" . $p_find["cate_name"],"_");
            # 获取到查询到的level进行加1 
            $data["level"] = $p_find["level"] + 1;
        }
        # logo图片处理
        # 判断他是否上传图片，同时图片里是否为空
        if(!empty($data["logo"]) && is_file(".".$data["logo"])){
            # 重新定义名称
            $logo_name = dirname($data["logo"]) .DS . "thumb_". basename($data["logo"]);
            # 获取图片 生成缩略图
            \think\Image::open(".".$data["logo"])->thumb(50,50)->save(".".$logo_name);
            # 将生成的缩略图重新赋值给image_url
            $data["image_url"] = $logo_name;
        }
        # 添加数据
        $ret = \app\common\model\Category::create($data,true);
        # 再根据加入成功后的数据进行查询到一条数据返回
        $find = \app\common\model\Category::where("id",$ret["id"])->find();
        # 返回数据
        $this->ok($find);
    }

    /**
     * 显示指定的资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function read($id)
    {
        $find = \app\common\model\Category::field("id,cate_name,pid,pid_path_name,level,is_show,image_url,is_hot")->where("id",$id)->find();
        $this->ok($find);
    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {
        # 接收参数
        $data = input();
        # 参数检测
        $validata = $this->validate($data,[
           "cate_name|分类名称" => "require", 
           "pid|父级ID" => "require|integer|>=:0", 
           "is_show|是否显示" => "require|in:0,1", 
           "is_hot|是否热门" => "require|in:0,1", 
           "sort|排序" => "require|integer", 
        ]);
        if($validata !== true){
            $this->fail($validata);
        }
        # 数据处理
        # 判断他是否是修改的pid是否等于0
        if($data["pid"] == 0){
            $data["pid_path"] = 0;
            $data["pid_path_name"] = "";
            $data["level"] = 0;
        }else{
            $p_find = \app\common\model\Category::where("id",$data["pid"])->find();
            $data["pid_path"] = $p_find["pid_path"] . "_" . $p_find["id"];
            $data["pid_path_name"] = trim($p_find["pid_path_name"] . "_" . $p_find["cate_name"],"_");
            $data["level"] = $p_find["level"] + 1;
        }
        # 判断他是否降级修改
        # 先根据id查询到一条数据
        $info = \app\common\model\Category::find($id);
        if($info["level"] < $data["level"]){
            $this->fail("不能降级修改");
        }
        # 判断他是否有上传图片
        if(isset($data["logo"]) && is_file(".".$data["logo"])){
            # 重新定义图片名称
            $logo_name = dirname($data["logo"]) . DS . "update_thumb_" . basename($data["logo"]);
            # 生成缩略图
            \think\Image::open(".".$data["logo"])->thumb(50,50)->save(".".$logo_name);
            # 返回新的图片名称
            $data["image_url"] = $logo_name;
        }
        # 修改数据
        $list = \app\common\model\Category::update($data,["id" => $id],true);
        $find = \app\common\model\Category::where("id",$list["id"])->find();
        # 返回数据
        $this->ok($find);
    }

    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id)
    {
        # 删除之前要查看要删除的分类下面是否还存在子分类，如果存在就不能删除
        $count = \app\common\model\Category::where("pid",$id)->count($id);
        # 判断是否能查询到数据，如果有那就不能删除
        if($count > 0){
            $this->fail("分类下还存在子分类不能删除");
        }
        # 查看分类下面是否有商口，如果有那也不能删除
        $goods = \app\common\model\Goods::where("cate_id",$id)->count($id);
        # 判断分类下面是否还存在商品
        if($goods > 0){
            $this->fail("分类下还存在商品不能删除");
        }
        # 查看分类下面是否有商口，如果有那也不能删除
        $brand = \app\common\model\Brand::where("cate_id",$id)->count($id);
        # 判断分类下面是否还存在商品
        if($brand > 0){
            $this->fail("分类下还存在品牌不能删除");
        }
        \app\common\model\Category::destroy($id);
        $this->ok();
    }
}
